/*
 * @Author: your name
 * @Date: 2021-12-23 15:11:13
 * @LastEditTime: 2021-12-26 17:23:52
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: /flutter-learning/Dart_Basic_Grammer/function.dart
 */

/**
 * 自定义方法基本格式：
 *      返回类型 方法名称 (args1, args2...) {
 *        方法体
 *        return 返回值;
 *    }
 */

void printInfo() {
  print('hellohello');
}

// 定义一个方法判断一个数是否为偶数
bool isEvennumber(int n) {
  if (n % 2 == 0) {
    return true;
  }
  return false;
}

// 入口方法
void main(List<String> args) {
  // 内置方法
  print('hello world');
  printInfo();

  // main 中定义方法
  int getNum() {
    var myNum = 123;
    return myNum;
  }

  var n = getNum();
  print(n);

  String printUserInfo(String username, int age) {
    return 'Name:$username -- Age:$age';
  }
  print(printUserInfo("Simon", 11));


  
  // 将方法当作参数
  fn1() {
    print("this is fn1");
  }
  fn2(fn1) {
    fn1();
  }

  fn2(fn1);


  List list = ['hello', 'world'];

  // 箭头函数
    // 箭头函数之中只能写一句话
  list.forEach((value) => {
    print('helloworld')
  });

  List num = [1, 2, 3, 4];
  var newlist = num.map((e) => e>2?e*2:e);
  print(newlist);

  printNum(int n) {
    for (var i = 0; i <= n; i++) {
      if (isEvennumber(i)) {
        print(i);
      }
    }
  }

  printNum(10);

  
  // 匿名方法
  var printUnname = (int n) {
    print(n + 2);
  };
  printUnname(20);


  // 自执行方法
  ((int n) {
    print(n);
    print("自执行方法");
  })(12);


  // 方法的递归
  var sum = 1;
  fn(int n) {
    sum *= n;
    if (n == 1) {
      return ;
    }
    fn(n - 1);
  }

  fn(5);

  print(sum);

  // 通过方法的递归求 1-100 的和
  var ssum = 0;
  ffn(int n) {
    ssum += n;
    if (n == 0) {
      return ;
    }
    ffn(n - 1);
  }
  ffn(100);
  print(ssum);


  /**
   *  函数闭包
   *    1. 全局变量：常驻内存，污染全局
   *    2. 局部变脸：不常驻内存，不污染全局
   * 
   *  闭包实现：
   *    1. 常驻内存
   *    2. 不污染全局
   * 
   *   实现：
   *      1. 函数嵌套函数，内部函数会调用外部函数的变量或参数，变量或参数不会被污染
   *   方法
   *      1. 函数嵌套函数，并 return 里边的函数，形成闭包
   * */ 

   fun() {
     var a = 123;
     return () {
       a++;
       print(a);
     };

   }

   var bb = fun();
   bb();
   bb();  
   bb();

}
